/*
 *创建3个窗口卖票,使用多线程方式1继承Thread方式
 * 存在线程安全问题，待解决
 *  */
public class ThreadTicketDemo {
    public static void main(String[] args) {
        window1 w1 = new window1();
        window1 w2 = new window1();
        window1 w3 = new window1();

        w1.start();
        w2.start();
        w3.start();
    }
}

class window1 extends Thread {
    private static int ticket = 100;
    //在mian方法中new了三个window1对象所以同步代码块的方法无用
    //因为监视器不是唯一
    //private Object obj = new Object();

    //使用static修饰后监视器就是唯一的了
    private static Object obj= new Object();
    //private synchronized void mmethod(){//错误方法，同步监视器为w1,w2,w3。
    private static synchronized void mmethod(){//使用同步方法解决线程安全问题，同步监视器为window1.class

        if (ticket > 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":这是第" + ticket + "张票");
            ticket--;
        }

    }
    @Override
    public void run() {
        while (true) {
            mmethod();//同步方法
            /*//在mian方法中new了三个window1对象所以同步代码块的方法无用
            //因为监视器不是唯一
            synchronized (obj) {
                //错误
                //synchronized(this){//此时this不是唯一，this代表着w1,w2,w3

                //正确
                //synchronized(window1.class){//此方法说名类也是对象
                if (ticket > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + ":这是第" + ticket + "张票");
                    ticket--;
                } else {
                    break;
                }
            }*/
        }
    }
}

